package com.zhong.service;

import com.zhong.dao.EmpDao;
import com.zhong.po.Emp;
import com.zhong.po.EmpExample;
import org.apache.catalina.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service      //标识该类为业务层
//@Controller   //标识该类为控制层
//@Repository   //标识该类为dao
//@Component    //不能确定时，泛指
public class EmpServiceImpl implements EmpService {

    @Autowired  //自动注入 DI
    private EmpDao empDao;

    //TODO: ****************************查询
    //selectByPrimaryKey: 根据主键进行查询
    //select id, emp_no, emp_name, job, mgr, hiredate, sal, comm, dept_no, create_time, create_by, update_time, update_by from emp
    // where id = ?
    public Emp selectByPrimaryKey(int id) {
        return empDao.selectByPrimaryKey(id);
    }

    //selectByExample: 多条件查询： 根据job和deptno
    //select id, emp_no, emp_name, job, mgr, hiredate, sal, comm, dept_no, create_time, create_by, update_time, update_by from emp
    // WHERE ( job = ? and dept_no = ? )
    public List<Emp> selectByExample(String job, int deptNo) {
        //1. 组装条件
        EmpExample example = new EmpExample();
        EmpExample.Criteria criteria = example.createCriteria();
        criteria.andJobEqualTo(job).andDeptNoEqualTo(deptNo);

//        example.createCriteria().andJobEqualTo(job).andDeptNoEqualTo(deptNo);

        //2. 查询
        List<Emp> list = empDao.selectByExample(example);
        return list;
    }

    //TODO: ****************************增加
    //insert:
    //insert into emp (id, emp_no, emp_name, job, mgr, hiredate, sal, comm, dept_no, create_time, create_by, update_time, update_by)
    // values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    //当对象的属性没有值的时候，条件进行新增，并且值为null
    public String insert(Emp emp) {
        empDao.insert(emp);
        return "ok";
    }

    // TODO: 推荐使用
    // insertSelective: insert into emp ( emp_no, emp_name ) values ( ?, ? )
    //当对象的属性没有值的时候，不作为条件进行新增，值为数据设置的默认值
    public String insertSelective(Emp emp) {
        empDao.insertSelective(emp);
        return "ok";
    }

    //TODO: ****************************删除
    //deleteByPrimaryKey： 根据主键删除
    public String deleteByPrimaryKey(int id) {
        empDao.deleteByPrimaryKey(id);
        return "ok";
    }

    //deleteByExample： 根据多条件删除
    public String deleteByExample(String job, String deptNo) {
        //empDao.deleteByExample();
        return "ok";
    }

    //TODO: ****************************修改
    //updateByPrimaryKey
    // 当属性值为空的时候，也进行修改，并且值为null
    //update emp set emp_no = ?, emp_name = ?, job = ?, mgr = ?, hiredate = ?, sal = ?, comm = ?, dept_no = ?, create_time = ?, create_by = ?, update_time = ?, update_by = ?
    // where id = ?
    public String updateByPrimaryKey(Emp emp) {
        empDao.updateByPrimaryKey(emp);
        return "ok";
    }

    //updateByPrimaryKeySelective TODO: 推荐使用
    //当属性值为空的时候，不进行修改
    //update emp SET emp_name = ? where id = ?
    public String updateByPrimaryKeySelective(Emp emp) {
        empDao.updateByPrimaryKeySelective(emp);
        return "ok";
    }

    //根据job和deptNo进行修改
    //updateByExample: 根据多条件进行修改
    //当属性值为空的时候，也进行修改，并且值为null
    public String updateByExample(Emp emp) {
        //1.拼装条件
        EmpExample empExample = new EmpExample();
        empExample.createCriteria().andJobEqualTo(emp.getJob()).andDeptNoEqualTo(emp.getDeptNo());

        empDao.updateByExample(emp, empExample);
        return "ok";
    }

    //updateByExample: 根据多条件进行修改(可选的)
    ////当属性值为空的时候，不进行修改
    public String updateByExampleSelectiv(Emp emp) {
        //1.拼装条件
        EmpExample empExample = new EmpExample();
        empExample.createCriteria().andJobEqualTo(emp.getJob()).andDeptNoEqualTo(emp.getDeptNo());

        empDao.updateByExampleSelective(emp, empExample);
        return "ok";
    }


}
